//
//  main.m
//  C11_函数指针
//
//  Created by dllo on 15/10/20.
//  Copyright (c) 2015年 dllo. All rights reserved.
//

#import <Foundation/Foundation.h>

void test(void)
{

    printf("函数\n");

}

void printHello()
{

    printf("啦啦啦\n");

}

int maxValue(int a, int b)
{

    int max = 0;
    max = a > b ? a : b;
    return max;

}

int sum(int a, int b)
{

    int sum = 0;
    sum = a + b;
    return sum;

}


void print(int cont, int (*p)(int a, int b))
{

    for (int i = 0; i < cont; i++) {
        printf("循环\n");
    }
    int ret = p(3, 5);
    printf("%d\n", ret);

}

typedef struct student{

    char name[20];
    char sex;
    int num;
    float score;

}Student;

typedef BOOL (*PFUN)(Student, Student);

BOOL compareNum(Student stu1, Student stu2)
{
    
   return  stu1.num > stu2.num ? 1 : 0;
    
}

BOOL compareName(Student stu1, Student stu2)
{
    
    return  strcmp(stu1.name, stu2.name) > 0 ? 1 : 0;
    
}

BOOL compareScore(Student stu1, Student stu2)
{
    
    return  stu1.score > stu2.score ? 1 : 0;
    
}

void sortStu(Student *stu, int cont, BOOL (*p)(Student stu1, Student stu2))
{

    for (int i = 0; i < cont - 1; i++) {
        for (int j = 0; j < cont - i - 1; j++) {
//            if (stu[j].num > stu[j + 1].num) {
            BOOL ret = p(stu[j], stu[j + 1]);
            if (1 == ret) {
                                Student temp = stu[j];
                stu[j] = stu[j + 1];
                stu[j + 1] = temp;
            }

        }
    }

}

void printStu(Student *stu, int cont)
{

    for (int i = 0; i < cont; i++) {
        printf("%s %c %d %.2f\n", stu[i].name, stu[i].sex, stu[i].num, stu[i].score);
    }

}

typedef BOOL (*PFUN)(Student stu1, Student stu2) ;
BOOL sortByNum(Student stu1, Student stu2)
{

    return stu1.num > stu2.num ? 1 : 0;

}

BOOL sortByScore(Student stu1, Student stu2)
{

    return stu1.score > stu2.score ? 1 : 0;

}





//void sortStu(Student *stu, int cont, PFUN p)
//{
//
//    for (int i = 0; i < cont - 1; i++) {
//        for (int j = 0; j < cont - i - 1; j++) {
////            if (stu[j].num > stu[j + 1].num) {
//            if (p(stu[j], stu[j + 1])) {
//                Student temp = stu[j];
//                stu[j] = stu[j + 1];
//                stu[j + 1] = temp;
//            }
//        }
//    }
//}
//
//void printStu(Student *stu, int cont)
//{
//
//    for (int i = 0; i < cont; i++) {
//        printf("%s %c %d %.2f\n", stu[i].name, stu[i].sex, stu[i].num, stu[i].score);
//    }
//
//}












int main(int argc, const char * argv[]) {

    // 定义一个指向无参无返回值类型函数的指针
//    void (*p)(void) = NULL;
//    
//    // 指向一个同类型的函数
//    p = test;
//    
//    // 调用指针所指向的函数
//    p();
    
//    void printHello();
//    定义一个可以指向上述函数的函数指针，并通过函数指针实现调用该函数。
    
//    void (*p)() = NULL;
//
//    p = printHello;
//    
//    p();
    
//    定义两个函数,一个求最大值,一个求和,输入maxValue或sum分别求3,5的最大值或和(提示,定义一个函数指针,根据输入内容指向不同函数,最后一次调用完成)。
    
//    int (*p)(int a, int b) = NULL;
//    
//    char str[10] = {0};
//    scanf("%s", str);
//    
//    if (0 == strcmp(str, "sum")) {
//        // 指向sum函数
//        p = sum;
//    }
//    if (0 == strcmp(str, "max")) {
//        // 指向maxValue函数
//        p = maxValue;
//    }
//    
//    // 调用
//    // p已经根据输入指向对应函数
//    int ret = p(3, 5);
//    printf("%d\n", ret);
//    
//    print(3, sum);
    
    Student stu[3] = {
        {"xiaNN", 'm', 3, 99.8},
        {"gaoS", 'm', 6, 88.8},
        {"wangN", 'n', 5, 100}
    };
    
    sortStu(stu, 3, sortByNum);
    printStu(stu, 3);
    
    
    
    
    
    
    return 0;
}
